
import { DateTimeCore } from './DateTimeCore';
import { DateTimeGetter } from './DateTimeGetter';
import { DateTimeConverter } from './DateTimeConverter';
import { DateTimeFormatter } from './DateTimeFormatter';
import { DateTimeCalculator } from './DateTimeCalculator';
import { type TimeType } from '../types';

/**
 * 日期时间处理工具类
 * @description 提供完整的日期时间操作功能，基于组合模式设计，使用懒加载优化性能
 * @extends DateTimeCore
 */
export class DateTime extends DateTimeCore {
  /**
   * 日期时间获取器实例（懒加载）
   * @private
   */
  private __getter?: DateTimeGetter;

  /**
   * 日期时间转换器实例（懒加载）
   * @private
   */
  private __converter?: DateTimeConverter;

  /**
   * 日期时间格式化器实例（懒加载）
   * @private
   */
  private __formatter?: DateTimeFormatter;

  /**
   * 日期时间计算器实例（懒加载）
   * @private
   */
  private __calculator?: DateTimeCalculator;

  /**
   * 获取日期时间获取器实例（懒加载）
   * @returns {DateTimeGetter} 日期时间获取器实例
   * @example
   * const date = new DateTime();
   * const year = date.getter.year(); // 获取年份
   */
  public get getter(): DateTimeGetter {
    if (!this.__getter) {
      this.__getter = new DateTimeGetter(this);
    }
    return this.__getter;
  }

  /**
   * 获取日期时间转换器实例（懒加载）
   * @returns {DateTimeConverter} 日期时间转换器实例
   * @example
   * const date = new DateTime();
   * const jsDate = date.converter.date(); // 转换为Date对象
   */
  public get converter(): DateTimeConverter {
    if (!this.__converter) {
      this.__converter = new DateTimeConverter(this);
    }
    return this.__converter;
  }

  /**
   * 获取日期时间格式化器实例（懒加载）
   * @returns {DateTimeFormatter} 日期时间格式化器实例
   * @example
   * const date = new DateTime();
   * const dateString = date.formatter.date(); // 格式化为日期字符串
   */
  public get formatter(): DateTimeFormatter {
    if (!this.__formatter) {
      this.__formatter = new DateTimeFormatter(this);
    }
    return this.__formatter;
  }

  /**
   * 获取日期时间计算器实例
   * @returns {DateTimeCalculator} 日期时间计算器实例
   * @example
   * const date = new DateTime();
   * const calculator = date.calculator.target('2023-01-01');
   * const diffResult = calculator.diff(); // 获取差值结果
   */
  public get diffCalculator(): DateTimeCalculator {
    if (!this.__calculator) {
      this.__calculator = new DateTimeCalculator(this);
    }
    return this.__calculator;
  }

  /**
   * 构造函数
   * @param {number|string|Date|dayjs.Dayjs|undefined} value - 可选的日期时间值，支持时间戳、字符串、Date对象或dayjs对象
   * @returns {DateTime} 新的DateTime实例
   * @example
   * // 使用当前时间
   * const now = new DateTime();
   * // 使用毫秒级时间戳
   * const date1 = new DateTime(1670553600000); // 2022-12-09T00:00:00.000Z
   * // 使用秒级时间戳
   * const date2 = new DateTime(1670553600); // 2022-12-09T00:00:00.000Z
   * // 使用日期字符串
   * const date3 = new DateTime('2025-12-11');
   * // 使用Date对象
   * const date4 = new DateTime(new Date());
   * // 使用dayjs对象
   * const date5 = new DateTime(dayjs());
   */
  constructor(value?: TimeType) {
    super(value as any);
  }

}